%require "3.5"
%language "c++"

%code requires
{
#include <cstdio>
#include <cctype>
#include <string>
#include <iostream>

enum T { U64, I64, CHAR, F64 };

struct Type 
{
	T ty;
	int width;
	int align;
};

}

%code
{
yy::parser::symbol_type yylex();
namespace yy
{
void error(const std::string& msg);
}
}

%define api.token.constructor 
%define api.value.type variant 

%token SEMICOLON YYEOF
%token <std::string> ID
%token <Type> U64 I64 CHAR F64
%nterm <Type> T

%%


P: %empty
| P D
;

D:
  T ID SEMICOLON
;

T: U64 | I64 | CHAR | F64 
;


%%

namespace yy
{
	void parser::error(const std::string& err)
	{ std::cerr << err << "\n"; }
}

int main()
{
	yy::parser parse;
	return parse();
}
